package com.ddwanglife.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class ShareData{
    private int number = 1;//A:1 B:2 C:3
    private Lock lock = new ReentrantLock();
    //一把锁配多把钥匙
    private Condition c1 = lock.newCondition();
    private Condition c2 = lock.newCondition();
    private Condition c3 = lock.newCondition();
    public void printFive(){
        lock.lock();
        try{
            while(number != 1){
                c1.await();
            }
            for(int i=1;i<=5;i++){
                System.out.println(Thread.currentThread().getName()+"\t"+i);
            }
            number = 2;
            c2.signal();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    public void printTen(){
        lock.lock();
        try{
            while(number != 2){
                c2.await();
            }
            for(int i=1;i<=10;i++){
                System.out.println(Thread.currentThread().getName()+"\t"+i);
            }
            number = 3;
            c3.signal();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
    public void printFifteen(){
        lock.lock();
        try{
            while(number != 3){
                c3.await();
            }
            for(int i=1;i<=15;i++){
                System.out.println(Thread.currentThread().getName()+"\t"+i);
            }
            number = 1;
            c1.signal();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }
}
/**
 * 多线程之间按顺序调用，实现A->B->C
 * 三个线程启动，要求如下：
 * AA打印5次，BB打印10次，CC打印15次
 * 接着
 * AA打印5次，BB打印10次，CC打印15次
 * 来10轮
 * 家庭作业，三个方法合一
 */
public class ConditionDemo {
    public static void main(String[] args) {
        ShareData sd = new ShareData();
        new Thread(()->{
            for(int i =0;i<10;i++){
                sd.printFive();
            }
        },"AA").start();
        new Thread(()->{
            for(int i =0;i<10;i++){
                sd.printTen();
            }
        },"BB").start();
        new Thread(()->{
            for(int i =0;i<10;i++){
                sd.printFifteen();
            }
        },"CC").start();
    }
}
